const Cesium = window.Cesium;

import { uuid } from "../../util";
import { CreatePosition } from "../../Config";


/**
 * 业务 Entity 基础类型(继承用)
 *
 * @param {Object} options 参数
 * @class BaseEntity
 * @example
 * 
 * new BaseEntity({
 *      id : null, // 可选 如果没有，则随机生成一个ID
 *      longitude : 100, // 经度 必填
 *      latitude : 40, // 纬度 必填
 *      height: 0, // 高度
 * })
 * 
 * 
 */
class BaseEntity {

    constructor(options) {
        this.options = options || {};
        /**
         * 经纬度缓存对象
         * @memberof BaseEntity
         */
        this.Position = {
            longitude: options.longitude || 0,
            latitude: options.latitude || 0,
            height: options.height || 0,
        };
        
        /**
         * Cesium.Entity 坐标缓存对象 （Cesium.Cartesian3 对象） 
         * 用于动态位置变更
         * @memberof BaseEntity
         */
        this.CesiumPosition = CreatePosition(this.Position);
        this.options.anime = options.anime || false;
        /**
         * Cesium.Entity 缓存对象
         * @memberof BaseEntity
         */
        this.Entity = new Cesium.Entity({
            id: options.id || uuid(),
            show: true,
            position: new Cesium.ConstantPositionProperty(this.CesiumPosition),
        });
        this.anime = null;
    }

    /**
     * 更新平台位置
     *
     * @param {Object} position 经纬度坐标点
     * @param {Number} time 动画持续事件
     * @param {Function} beginCallback 开始时回调事件
     * @param {Function} updateCallback 结束后回调事件
     * @memberof BaseEntity
     */
    setPosition(position, time, beginCallback, updateCallback) {
        time = time || 700;
        if (this.options.anime) {
            this.anime = window.anime({
                targets: this.Position,
                longitude: position.longitude,
                latitude: position.latitude,
                height: position.height || this.options.height,
                duration: time || 700,
                easing: 'linear',
                round: 100000000,
                begin: (anim) => {
                    beginCallback && beginCallback(position);
                },
                update: () => {
                    this.CesiumPosition = CreatePosition(this.Position);
                    this.Entity.position.setValue(this.CesiumPosition);
                    updateCallback && updateCallback(this.CesiumPosition);
                }
            });
        } else {
            this.CesiumPosition = CreatePosition(this.Position);
            this.Entity.position.setValue(this.CesiumPosition);
            updateCallback && updateCallback(this.CesiumPosition);
        }
    }
}




export { BaseEntity };